/*
 * Copyright 2010 - Jeremie Brebec
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.jb.ui.user.client;


import org.jb.user.client.LoginPanel;
import org.jb.user.client.LoginPanel.LoginPanelListener;

import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Html;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.Layer.ShadowPosition;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.inject.Inject;

/**
 * 
 * @author jeremie
 *
 */
public class LoginDialog extends Dialog {

	public LoginDialog() {		
	    FormLayout layout = new FormLayout();
	    layout.setLabelWidth(90);
	    layout.setDefaultWidth(155);
	    setLayout(layout);
	    
	    setButtonAlign(HorizontalAlignment.LEFT);
	    setButtons("");
	    setModal(false);
	    setBodyBorder(true);
	    setBodyStyle("padding: 8px;background: none");
	    setWidth(300);
	    setResizable(false);
	    setDraggable(false);
	    setClosable(false);
	    setShadowOffset(10);
	    setShadowPosition(ShadowPosition.DROP);

	    KeyListener keyListener = new KeyListener() {
			public void componentKeyUp(ComponentEvent event) {
		        validate();
		        
		        if (event.getKeyCode() == 13 && login.isEnabled())
		        	onSubmit();
		      }
	    };

	    userName = new TextField<String>();
	    userName.setFieldLabel( constants.pseudo() );
	    userName.addKeyListener( keyListener );
	    add(userName);

	    Html htmlTxt = new Html( constants.accountText() );
	    add( htmlTxt );
	    
	    password = new TextField<String>();
	    password.setPassword(true);
	    password.setFieldLabel( constants.password() );
	    password.addKeyListener(keyListener);
	    add(password);

	    setFocusWidget(userName);
	}
	
	/*
	 * 
	 */
	public void setListener(LoginPanelListener listener ) {
		this.listener = listener;
	}
	
	/**
	 * 
	 */
	@Override
	protected void createButtons() {
		super.createButtons();
		status = new Status();
		status.setBusy( constants.connect() );
		status.hide();
		status.setAutoWidth(true);
		getButtonBar().add(status);

		getButtonBar().add(new FillToolItem());

		reset = new Button( constants.reset() );
		reset.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				userName.reset();
				password.reset();
				validate();
				userName.focus();
			}

		});

		login = new Button( constants.login() );
		if (!GXT.isSafari) {
			login.disable();
		}
		login.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				onSubmit();
			}
		});

		addButton(reset);
		addButton(login); 
	}
	
	/**
	 * 
	 */
	protected void onSubmit() {
		status.show();
		getButtonBar().disable();
		
		listener.onLogin( userName.getValue(), password.getValue() );
	}
	
	public void failed() {
		status.hide();
		getButtonBar().enable();
		
	    password.forceInvalid( constants.invalidPassword() );
	}
	
	/**
	 * 
	 * @param field
	 * @return
	 */
	protected boolean hasValue(TextField<String> field) {
		return field.getValue() != null && field.getValue().length() > 0;
	}

	/**
	 * 
	 */
	protected void validate() {
		login.setEnabled( hasValue(userName) ); 
	}
	
	private TextField<String> userName;
	private TextField<String> password;
	private Button reset;
	private Button login;
	private Status status;

	@Inject
	private UserConstant constants;
	
	private LoginPanel.LoginPanelListener listener;
}